home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_10_09
/
1009119a
< prev
next >
Wrap
Text File
|
1992-06-22
|
4KB
|
189 lines
/*
Copyright (C) 1992 by Mark W. Schumann
convtext.cpp -- Convert a text file into
one or more existing Clipper files under
marker-file control.
Compiler: Borland C++ 2.0.
Library: SoftC version 3.0.
20 April 1992, by Mark W. Schumann
Usenet: mark@whizbang.ncoast.org
Compile (Borland) with:
bcc -ms -lm convtext.cpp scdbp20s.lib
*/
#include <softc.h>
#include <sc_base.h>
#include <fstream.h>
#include <iostream.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#define LINELENGTH 200
int convtext (char *);
char *strtrim (char *);
int nextmark (int, long &, char *, char *);
int main (int argc, char *argv[])
{
scdinit (5, 0);
convtext ("POLLSEND.TXT");
scdterm();
}
int convtext (char *textfile)
{
ifstream ip; // Text input stream.
char tempname[80]; // Builds file name.
char s[LINELENGTH+2]; // Text record buffer.
char *p; // Throwaway pointer.
int dbf = -1; // Output database handle.
long recno; // Current record number.
int markdbf; // Marker database handle.
char marktext[30]; // Text to indicate mark record.
char markfile[9]; // Output file indicated by mark.
long markrec = 0L; // Current record in marker file.
int marklen; // Length of marker for comparison.
s[0] = ' '; // Record status byte.
ip.open (textfile);
if (!ip) {
cout << "Couldn't open " << textfile << ".\n";
return -1;
}
scddopenx (&markdbf, "DATAMARK.DBF", 0);
if (scecode() < 0) {
cout << "Couldn't open marker file. "
<< "SoftC error was " << scecode() << '\n';
return -1;
}
nextmark (markdbf, markrec, marktext, markfile);
strtrim (marktext);
marklen = strlen (marktext);
while (ip.getline (&s[1], LINELENGTH)) {
sceclr();
// Trim trailing newline.
p = strchr (&s[1], '\n');
if (p != NULL) *p = '\0';
// Next data marker record reached?
if (strncmp (marktext, &s[1], marklen) == 0) {
// Close current output database.
if (dbf != -1) scddclose (dbf);
// Build full name of the target file.
strcpy (tempname, markfile);
strtrim (tempname);
strcat (tempname, ".DBF");
// Now open it.
cout << "\nOpening " << markfile << '\n';
scddopenx (&dbf, tempname,
SC_RDWR | SC_EXCLUDE);
scddsize (dbf, &recno);
// Use the next marker.
nextmark (markdbf, markrec,
marktext, markfile);
if (scecode() < 0) {
cout << "Error opening " <<
tempname << ". SoftC error was " <<
scecode() << '\n';
break;
}
}
else {
if (dbf == -1) {
cout << "Input file doesn't begin with a" <<
" data marker.\n";
break;
}
recno++;
// Write the record to the database.
if (scddrputx (dbf, s, &recno, SC_ADD) < 0) {
cout << "Couldn't add record " << recno
<< "; SoftC error " << scecode()
<< ' ' << scemsg() << '\n';
break;
}
else
cout << "Record number " << recno
<< " added.\r";
}
}
cout << '\n';
ip.close();
scddclose (markdbf);
if (dbf != -1) scddclose (dbf);
return 0;
}
// Remove trailing whitespace from a string.
char *strtrim (char *s)
{
register char *p;
char *q = NULL; // Last printing character.
for (p = s; *p; p++)
if (!isspace (*p)) q = p;
if (q != NULL)
*++q = '\0';
return s;
}
// This assumes that we have a marker text description
// in field 1 and marker file name in field 2. It is also
// counting on character buffers long enough to hold the
// results.
int nextmark (int dbf, long &rec, char *text, char *file)
{
scddrget (dbf, ++rec);
scddfget (dbf, 1, text);
scddfget (dbf, 2, file);
return scecode();
}